#pragma once

#include "../base/types.h"

OPEN_JLIB_NS


struct HEX {

  constexpr static uwl encode_hint (uwl len) noexcept {
    return len << 1;
  }

  constexpr static uwl decode_hint (uwl len) noexcept {
    return len & 1 ? 0 : len >> 1;
  }


  static uwl encode (void* dst, const void* src, uwl len, bool lower_case = false) noexcept;

  static uwl decode (void* dst, const void* src, uwl len) noexcept;



//    u8v16 z, A, a, A10, a10, temp;
//    register u8v16 lhb asm ("v30");
//    register u8v16 hhb asm ("v31");
//    asm volatile (R"(
//      DUP %[z].16b, %w[z_r]
//      DUP %[A].16b, %w[A_r]
//      DUP %[a].16b, %w[a_r]
//      DUP %[A10].16b, %w[A10_r]
//      DUP %[a10].16b, %w[a10_r]
//    1:CMP %[len], #32
//      B.LT 2f
//      LD1 { %[lhb].16b, %[hhb].16b }, [%[src]]
//      CMGE %[temp].16b, %[lhb].16b, %[a].16b
//      MLS %[lhb].16b, %[temp].16b, %[a10].16b
//      CMGE %[temp].16b, %[lhb].16b, %[A].16b
//      MLS %[lhb].16b, %[temp].16b, %[A10].16b
//      CMGE %[temp].16b, %[lhb].16b, %[z].16b
//      MLS %[lhb].16b, %[temp].16b, %[z].16b
//      CMGE %[temp].16b, %[hhb].16b, %[a].16b
//      MLS %[hhb].16b, %[temp].16b, %[a10].16b
//      CMGE %[temp].16b, %[hhb].16b, %[A].16b
//      MLS %[hhb].16b, %[temp].16b, %[A10].16b
//      CMGE %[temp].16b, %[hhb].16b, %[z].16b
//      MLS %[hhb].16b, %[temp].16b, %[z].16b
//      USHL %[lhb].8h, %[lhb].8h, #4
//      USHR %[temp].8h, %[lhb].8h, #16
//      ORR %[lhb].16b, %[lhb].16b, %[temp].16b
//      USHL %[hhb].8h, %[hhb].8h, #4
//      USHR %[temp].8h, %[hhb].8h, #16
//      ORR %[hhb].16b, %[hhb].16b, %[temp].16b
//      UZP1 %[temp].16b, %[lhb].16b, %[hhb].16b
//      ST1 { %[temp].16b }, [%[dst]]
//      ADD %[src], %[src], #32
//      ADD %[dst], %[dst], #16
//      SUB %[len], %[len], #16
//    2:)"
//      :[dst]"+r"(dst), [src]"+r"(src), [len]"+r"(len), [z]"=&w"(z), [A]"=&w"(A), [a]"=&w"(a), [A10]"=&w"(A10), [a10]"=&w"(a10), [temp]"=&w"(temp), [lhb]"=&w"(lhb), [hhb]"=&w"(hhb)
//      :[zero_r]"r"('0'), [char_A_r]"r"('A'), [char_a_r]"r"('a'), [char_A10_r]"r"('A' - 10), [char_a10_r]"r"('a' - 10)
//    );

};


CLOSE_JLIB_NS